Redshiftで各テーブルのカラム毎の利用ブロック数を確認する
データアナリティクス事業本部のueharaです。
今回はAmazon Redshiftで各テーブルのカラム毎の利用ブロック数を確認するという処理をしてみたいと思います。
Redshiftのブロックサイズについて
Redshiftは列指向型のデータベースであり、各データブロックには複数行に渡る1つのカラムの値が格納されます。
(参考)
特に、Redshiftでは1MBのブロックサイズを採用しています。
一般的なデータベースのブロックサイズは2KB~32KBのため、それと比較するとRedshiftは大きい値となっており、この大きめに取られたブロックサイズがクエリを高速に処理可能な要因の1つになっています。
テーブル毎のレコード数と、それに対しカラム毎で利用されているブロック数を把握することは、将来のテーブルサイズを見積もる上での有用な参考情報となります。
以下で、Redshiftの各テーブルのカラム毎の利用ブロック数を確認する方法を紹介します。
利用ブロック数の確認
まず結論から、STV_BLOCKLISTを利用することでデータベース内の各スライス、テーブル、カラムで使用されているブロック数を確認することができます。
上記公式ドキュメントではテーブル名を指定してカラム番号と利用ブロック数を表示させるサンプルクエリが記載されていますが、ここでは全テーブルに対し、カラム名といった情報も付加して出力するクエリを紹介します。
SQLは以下の通りです。
WITH table_info AS ( SELECT database, schema, "table", table_id, column_name, ordinal_position FROM SVV_TABLE_INFO JOIN SVV_COLUMNS ON SVV_TABLE_INFO.schema = SVV_COLUMNS.table_schema AND SVV_TABLE_INFO."table" = SVV_COLUMNS.table_name ), block_cnt_info AS ( SELECT slice, tbl, col, MAX(num_values) AS max_num_values, COUNT(*) AS block_cnt FROM STV_BLOCKLIST GROUP BY slice, tbl, col ) SELECT slice, database, schema AS schema_name, "table" AS table_name, column_name, ordinal_position AS column_no, max_num_values, block_cnt FROM block_cnt_info JOIN table_info ON block_cnt_info.tbl = table_info.table_id AND block_cnt_info.col = table_info.ordinal_position -- adminスキーマの情報は不要なため除外 WHERE schema <> 'admin' ORDER BY database, schema, "table", ordinal_position, slice
上記の例では、まずSVV_TABLE_INFOからスキーマ名やテーブル名、カラム名といったテーブル情報をテーブルIDと共に一時テーブルに取得し、SVV_BLOCKLISTで取得したブロック数の一時テーブルと結合して出力するといった形を取っています。
出力される結果のテーブルは以下の構成となっています。
カラム名 | 説明 |
---|---|
slice | ノードスライス |
database | データベース名 |
schema_name | スキーマ名 |
table_name | テーブル名 |
column_name | カラム名 |
colimn_no | カラム番号 |
max_num_values | 1ブロック中に含まれるレコード数の最大値 |
block_cnt | ブロック数 |
具体的には、以下のようなデータが確認できると思います。
slice | database | schema_name | table_name | column_name | column_no | max_num_values | block_cnt |
---|---|---|---|---|---|---|---|
1 | db-01 | schema_1 | table_X | aaa | 1 | 10 | 1 |
1 | db-01 | schema_1 | table_X | bbb | 2 | 10 | 1 |
0 | db-01 | schema_1 | table_Y | ccc | 1 | 1000 | 4 |
0 | db-01 | schema_1 | table_Y | ddd | 2 | 2000 | 2 |
0 | db-01 | schema_1 | table_Y | eee | 3 | 500 | 8 |
最後に
今回はAmazon Redshiftで各テーブルのカラム毎の利用ブロック数を確認するという処理をしてみました。
参考になりましたら幸いです。